package com.study.kt._01grammar._01basic

fun main() {
    //println(say("slx"))

    /*testDefaultFun("slx", 12)
    testDefaultFun(age = 11)*/
    //如果要使用默认参数，其他参数就需要添加变量名
    //testDefaultFun(age = 12)
    //使用具名参数调用，参数位置可以改变
    //testDefaultFun(age = 12,name = "jay")

    testVar(1, 2, 3)
}

//可变参数,params为一个Int数组
fun testVar(vararg params: Int) {
    var sum = 0
    for (param in params) {
        sum += param
    }
    println(sum)
}

//默认参数,name有默认值,如果只传age只能通过具名参数方式使用
//一般用于类似Java的方法重载
fun testDefaultFun(name: String = "fauks", age: Int) {
    println("$name=$age")
}

//参数 返回值
fun say(name: String): String {
    return "hello $name"
}

open class Argu {
    open fun test(a: Int = 1, b: Int = 2): Int {
        return a + b
    }
}

class ArguChild : Argu() {
    // 重写父类方法不能再指定默认值而是使用父类的默认值
    override fun test(a: Int, b: Int): Int {
        return super.test(a, b)
    }
}

// 中缀表达式
class InfixClz {
    //infix 修饰方法 该方法可以使用中缀表达式调用，也可以使用常规方法调用
    infix fun test(name: String) {
        println(name)
    }
}

/**
 * 中缀表达式
 *  1.函数只能有一个参数
 *  2.调用函数：对象 函数名 参数
 */
fun testInfix() {
    val infixClz = InfixClz()
    infixClz.test("fauks")
    //使用中缀表达式调用
    infixClz test "sunlingxiao"

    val p = Pair(1, 2)
    //在元组属性的定义中，to 也是一个中缀表达式
    var p2 = 1 to 2
    println(p.first)
}